var nativeSlice = Array.prototype.slice
var nativeConcat = Array.prototype.concat

Function.prototype.bind = function() {
  var self = this
  var context = arguments[0]
  var args = nativeSlice.call(arguments, 1)
  return function() {
    args = nativeConcat.call(args, nativeSlice.call(arguments, 0))
    return self.apply(context, args)
  }
}
